<?php

namespace PSC\Controller;

/**
 * Elemento de Resposta
 *
 * Durante uma conexão, o sistema processa muitas informações que devem ser
 * renderizadas na camada de visualização. Esta, ao final da execução, apresenta
 * seu conteúdo renderizado para o elemento de resposta que envia ao cliente os
 * valores.
 *
 * @category PSC
 * @package  PSC\Controller
 */
class Response
{
    /**
     * Conjunto de Cabeçalhos
     * @var array
     */
    protected $_headers = array();

    /**
     * Conteúdo Corpo da Mensagem
     * @var string
     */
    protected $_body = null;

    /**
     * Configuração de Cabeçalho
     *
     * Durante a configuração de resposta, podemos armazenar informações no
     * cabeçalho que serão enviados para o cliente somente ao final do
     * processamento do sistema.
     *
     * @param  string   $name  Nome do Cabeçalho
     * @param  string   $value Valor para Configuração
     * @return Response Próprio Objeto para Encadeamento
     */
    public function setHeader($name, $value)
    {
        // Conversão
        $name  = (string) $name;
        // Tipagem de Valor
        if ($value === null) {
            // Remoção de Elemento
            unset($this->_headers[$name]);
        } else {
            // Conversão
            $value = (string) $value;
            // Configuração
            $this->_headers[$name] = $value;
        }
        // Encadeamento
        return $this;
    }

    /**
     * Captura de Cabeçalhos
     *
     * Apresentação de todos os cabeçalhos configurados durante o processamento
     * do sistema. Estes são apresentados de foram completa e não serão enviados
     * ao cliente neste momento.
     *
     * @return array Conjunto de Cabeçalhos Solicitado
     */
    public function getHeaders()
    {
        // Apresentação
        return $this->_headers;
    }

    /**
     * Limpeza de Cabeçalho
     *
     * Remove uma entrada do cabeçalho na requisição durante o processamento,
     * não enviando ao cliente a entrada apresentada.
     *
     * @param  string $name Nome do Parâmetro para Limpeza
     * @return Response Próprio Objeto para Encadeamento
     */
    public function clearHeader($name)
    {
        // Configuração
        return $this->setHeader($name, null);
    }

    /**
     * Configuração de Corpo de Mensagem
     *
     * Durante uma comunicação utilizando o protocolo HTTP, podemos utilizar um
     * meio de armazenamento do conteúdo que será apresentado como resposta para
     * o cliente e somente após enviar as informações, já que isto é necessário
     * pois nem sempre devemos enviar uma saída.
     *
     * @param  string   $body Corpo do Documento para Configuração
     * @return Response Próprio Objeto para Encadeamento
     */
    public function setBody($body)
    {
        // Conversão
        $body = (string) $body;
        // Configuração
        $this->_body = $body;
        // Encadeamento
        return $this;
    }

    /**
     * Apresentação do Corpo da Mensagem
     *
     * Captura do conteúdo configurado como corpo de mensagem, visando
     * centralizar completamente o conteúdo que será enviado para o cliente
     * antes de configurar os cabeçalhos.
     *
     * @return string Conteúdo Configurado
     */
    public function getBody()
    {
        // Apresentação
        return $this->_body;
    }

    /**
     * Saída Padrão
     *
     * Processa totalmente os cabeçalhos configurados e envia para a saída
     * padrão o conteúdo configurado como corpo da resposta.
     *
     * @return Response Próprio Objeto para Encadeamento
     */
    public function output()
    {
        // Construção de Cabeçalhos
        foreach ($this->getHeaders() as $name => $value) {
            // Processamento
            header("$name: $value");
        }
        // Envio de Corpo da Mensagem
        echo $this->getBody();
        // Encadeamento
        return $this;
    }

}

